
/**
 * 
 * 考勤信息
 * 题目描述

公司用一个字符串来表示员工的出勤信息

absent：缺勤
late：迟到
leaveearly：早退
present：正常上班
现需根据员工出勤信息，判断本次是否能获得出勤奖，能获得出勤奖的条件如下：

缺勤不超过一次；
没有连续的迟到/早退；
任意连续7次考勤，缺勤/迟到/早退不超过3次。

输入描述
用户的考勤数据字符串

记录条数 >= 1；
输入字符串长度 < 10000；
不存在非法输入；
如：

2
present
present absent present present leaveearly present absent
输出描述
根据考勤数据字符串，如果能得到考勤奖，输出”true”；否则输出”false”，
对于输入示例的结果应为：

true false

用例
输入	2
present
present present
输出	true true
说明	无
输入	2
present
present absent present present leaveearly present absent
输出	true false
说明	无



 * 
 */

import java.util.Scanner;
import java.util.StringJoiner;

/**
 * 
 * 题目解析
本题需要注意下

没有连续的迟到/早退；

根据考友反馈，连续的迟到/早退，应该指：本次是迟到或早退，上次也是迟到或早退。

比如，本次是迟到，上次是早退，则也算是：连续的迟到/早退

本题主要难点在于如果统计”任意连续7次考勤“中的缺勤/迟到/早退次数。

这里我们可以使用滑动窗口，且滑窗窗口的长度最大为7

当滑窗右边界索引R < 7 时，则滑窗长度 = R + 1
当滑窗右边界索引R >= 7时，则滑窗长度 = 7，同时能推导出滑窗左边界索引L为 = R - 6
如下图所示



我们只要计算出滑窗内部 present 次数，即可通过：

滑窗长度  - present次数 = 任意连续7次考勤中的缺勤/迟到/早退次数

二位数组保存考勤数据

处理单次考勤
滑动窗口长度不超过 7 任意连续7次
滑动窗口长度大于7 则移动起点指针往右i-7 位，移动出窗口的位置需要判断是不是正常上班，如果有这需要把这些次数减掉
任意连续7次考勤，缺勤/迟到/早退不超过3次, 相当于判断： 滑窗长度 - present次数 <= 3
窗口长度  min(i+1 , 7) - 正常上班次数

 */
public class 考勤信息 {
    
    public static void main(String[] args) {
        
        try{

            Scanner scanner = new Scanner(System.in);

            //记录条数
            int recordCount = Integer.parseInt(scanner.nextLine());

            //二维数组保存考勤数据
            String[][] attendance = new String[recordCount][];

            for(int i=0; i<recordCount; i++){
                attendance[i] = scanner.nextLine().split(" ");
            }

            StringJoiner stringJoiner = new StringJoiner(" ");

            for(int  i=0; i< attendance.length; i++){

                stringJoiner.add(doHandle(attendance[i]) + "");
            }

            System.out.println(stringJoiner.toString());


        }catch(Exception e){
            e.printStackTrace();
        }

    }

    private static boolean doHandle(String[] subAttendance){

        int absentCount = 0;//总缺勤次数
        int presentCount = 0;//正常上班次数
        String preRecord = "";

        for(int i=0; i<subAttendance.length; i++){

            if(i >= 7){

                // 滑窗长度最大为7，如果超过7，则滑窗的左边界需要右移, 滑窗失去的部分record[i - 7]
                // 如果失去部分是present，则更新滑窗内present次数

                if("present".equals(subAttendance[i - 7])){

                    presentCount-- ;

                }
            }

            //当前考勤记录
            String curRecord = subAttendance[i];

            switch (curRecord) {
                case "absent":
                   //缺勤
                    if(++absentCount > 1) {
                        return false;
                    }
                    break;
                case "late":
                case "leaveearly":
                    //迟到、早退
                     if("late".equals(preRecord) || "leaveearly".equals(preRecord)){
                        return false;
                     }
                     break;
                case "present":
                    presentCount++;
                    break;
                default:
                    break;
            }

            preRecord = curRecord;

            // 任意连续7次考勤，缺勤/迟到/早退不超过3次, 相当于判断： 滑窗长度 - present次数 <= 3
            int window_len = Math.min(i + 1, 7); // 滑窗长度
            if (window_len - presentCount > 3){
                return false;
            } 

        }

        return true;

    }
}
